package Daos;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import logica.acciones.Coordenada;
import logica.objetos.Mapa;
import excepciones.PersistenciaException;
/**
 * @version 8/3/13
 * @author GRUPODOS
 *
 */
public class Mapas {
	/**
	 * ingresa un mapa en la persistencia	 * 
	 * @param t la transaccion
	 * @param m el mapa
	 * @return el id recien generado
	 * @throws PersistenciaException si ocurre error SQL
	 */
	public int insertarMapa(Connection t, Mapa m) throws PersistenciaException {
		/*
		int resu = 0;
		try {
			ConsultasSQL consultas = new ConsultasSQL();

			String query = consultas.insertarMapa();
			PreparedStatement pstmt = t.prepareStatement(query);
			pstmt.setInt(1, 0);
			pstmt.setInt(2, m.getColumnas());
			pstmt.setInt(3, m.getFilas());
			pstmt.setString(4, m.getSecuenciaNavegabilidad());
			pstmt.executeUpdate();
			// ver como manejar la matriz
			ResultSet rs = pstmt.getGeneratedKeys();
			if (rs.next())
				resu = rs.getInt(1);//retorno el id generado

			pstmt.close();

		} catch (SQLException e) {
			throw new PersistenciaException(
					"Ocurrio un error en el acceso a la BD al insertar");
		}
		return resu;
		*/
		return 0;
	}

	/**
	 * busca un mapa por cuyo id sea el numero ingresado 
	 * @param t la transaccion
	 * @param id el numero a buscar
	 * @return el mapa si existe, null si no
	 * @throws PersistenciaException si ocurre error SQL
	 */
	public Mapa buscarMapa(Connection t, int idMapa)
			throws PersistenciaException {
		Mapa resu = null;
		try {
			ConsultasSQL Consulta = new ConsultasSQL();
			
			String query = Consulta.CantidadFilasMapa();
			PreparedStatement pstmt = t.prepareStatement(query);
			pstmt.setInt(1, idMapa);

			int filas = 0; 
			int columnas = 0;
			
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				filas = rs.getInt(1);				
			}
			rs.close();
			pstmt.close();
			
			query = Consulta.CantidadColumnasMapa();
			pstmt = t.prepareStatement(query);
			pstmt.setInt(1, idMapa);
			
			rs = pstmt.executeQuery();
			if (rs.next()) {
				columnas = rs.getInt(1);				
			}
			rs.close();
			pstmt.close();
			
			int[][] matriz = new int[filas][columnas];
			query = Consulta.buscarMapa();
			pstmt = t.prepareStatement(query);
			pstmt.setInt(1, idMapa);
			
			int fila, columna, valor;
			rs = pstmt.executeQuery();
			while (rs.next()) {
				fila = rs.getInt("fila");				
				columna = rs.getInt("columna");
				valor = rs.getInt("valor");
				matriz[fila][columna] = valor;
			}
			rs.close();
			pstmt.close();
			
			resu =  new Mapa(idMapa);
			resu.setMatriz(matriz);
			return resu;

		} catch (SQLException e) {
			throw new PersistenciaException(
					"Ocurrio un error en el acceso a los datos");
		}		
	}
	/**
	 * metodo que controla si un punto en el mapa es navegable
	 * @param t la transaccion
	 * @param punto la cooredenada x e y
	 * @param idMapa el identificador del mapa
	 * @return true si es navegable, false si no lo es
	 * @throws PersistenciaException si ocurre error SQL
	 */
	public boolean buscarNavegable(Connection t, Coordenada punto, int idMapa) throws PersistenciaException
	{
		boolean resu=false;
		
		try {
			ConsultasSQL Consulta = new ConsultasSQL();
			
			String query = Consulta.buscarCoordenadaEnMapa();
			PreparedStatement pstmt = t.prepareStatement(query);
			pstmt.setInt(1, idMapa);
			pstmt.setInt(2, punto.getY());
			pstmt.setInt(3, punto.getX());
			
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				int valor=rs.getInt("valor");
				if (valor==164)//Si tiene valor de navegable
					resu=true;
			}
			rs.close();
			pstmt.close();

		} catch (SQLException e) {
			throw new PersistenciaException(
					"Ocurrio un error en el acceso a los datos");
		}
		return resu;
	}



}
